/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package org.cip.esymons.eventos.beans;


import java.awt.Desktop;
import java.io.File;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.faces.webapp.FacesServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.cip.esymons.eventos.adapaters.Impresiones;
import org.cip.esymons.eventos.bc.FormatoCertificadoDelegate;
import org.cip.esymons.eventos.bc.EntregaCertificadoDelegate;
import org.cip.esymons.eventos.bc.MatriculaDelegate;
import org.cip.esymons.eventos.be.EntregaCertificado;
import org.cip.esymons.eventos.be.FormatoCertificado;
import org.cip.esymons.eventos.be.Matricula;
import org.cip.esymons.eventos.be.PreinscripcionEvento;
import org.cip.esymons.general.be.PersonaNatural;
import org.cip.esymons.general.util.ControladorAbstracto;
import org.cip.esymons.general.util.Utiles;

/**
 *
 * @author Lizardo Rios
 */
public class EntregaCertificadoController {

    private EntregaCertificadoDelegate delegado;
    private FormatoCertificadoDelegate delegadoFormatoCertificado;
    private MatriculaDelegate delegadoMatricula;
    private List<EntregaCertificado> listaEntregaCertificado;
    private List<EntregaCertificado> listaEntregaCertificadoV2;
    List<FormatoCertificado> listaFormatoCertificado;
    List<Matricula> listaMatricula;
    List<Matricula> listaInscritos;
    List<PreinscripcionEvento> listaInscritosV2;
    List<PreinscripcionEvento> listaInscripcionesV2;
    private Integer codigoEvento;
    private Integer codigoFormato;
    private Matricula matricula;
    private FormatoCertificado formatoCertificado;
    private EntregaCertificado entregaCertificado;
    private PersonaNatural persona;
    private String archivo;
    private String total;


    /***************************  Constructor *******************************/
    public EntregaCertificadoController() {
        entregaCertificado = new EntregaCertificado();
        delegado = new EntregaCertificadoDelegate();
        delegadoFormatoCertificado = new FormatoCertificadoDelegate();
        delegadoMatricula = new MatriculaDelegate();
        listaEntregaCertificado = new ArrayList<EntregaCertificado>();
        listaEntregaCertificadoV2 = new ArrayList<EntregaCertificado>();
        listaInscritosV2 = new ArrayList<PreinscripcionEvento>();
        listaInscripcionesV2 = new ArrayList<PreinscripcionEvento>();
        listaFormatoCertificado = new ArrayList<FormatoCertificado>();
        listaMatricula = new ArrayList<Matricula>();
        listar();
        listarV2();
    }

    /*************************** Setters and Getters  ***********************/
    public String getTotal() {
        return total;
    }
    public void setTotal(String total) {
        this.total = total;
    }

    public EntregaCertificadoDelegate getDelegado() {
        return delegado;
    }

    public List<EntregaCertificado> getListaEntregaCertificado() {
        listar();
        return listaEntregaCertificado;
    }
    public void setListaEntregaCertificado(List<EntregaCertificado> listaEntregaCertificado) {
        this.listaEntregaCertificado = listaEntregaCertificado;
    }

    public List<EntregaCertificado> getListaEntregaCertificadoV2() {
        listarV2();
        return listaEntregaCertificadoV2;
    }

    public void setListaEntregaCertificadoV2(List<EntregaCertificado> listaEntregaCertificadoV2) {
        this.listaEntregaCertificadoV2 = listaEntregaCertificadoV2;
    }

    public List<PreinscripcionEvento> getListaInscritosV2() {
        return listaInscritosV2;
    }

    public void setListaInscritosV2(List<PreinscripcionEvento> listaInscritosV2) {
        this.listaInscritosV2 = listaInscritosV2;
    }

    public List<PreinscripcionEvento> getListaInscripcionesV2() {
        return listaInscripcionesV2;
    }

    public void setListaInscripcionesV2(List<PreinscripcionEvento> listaInscripcionesV2) {
        this.listaInscripcionesV2 = listaInscripcionesV2;
    }

    

    public FormatoCertificadoDelegate getDelegadoFormatoCertificado() {
        return delegadoFormatoCertificado;
    }
    public void setDelegadoFormatoCertificado(FormatoCertificadoDelegate delegadoFormatoCertificado) {
        this.delegadoFormatoCertificado = delegadoFormatoCertificado;
    }

    public Integer getCodigoFormato() {
        return codigoFormato;
    }
    public void setCodigoFormato(Integer codigoFormato) {
        this.codigoFormato = codigoFormato;
    }

    public List<Matricula> getListaMatricula() {
        return listaMatricula;
    }
    public void setListaMatricula(List<Matricula> listaMatricula) {
        this.listaMatricula = listaMatricula;
    }

    public MatriculaDelegate getDelegadoMatricula() {
        return delegadoMatricula;
    }
    public void setDelegadoMatricula(MatriculaDelegate delegadoMatricula) {
        this.delegadoMatricula = delegadoMatricula;
    }

    public Matricula getMatricula() {
        return matricula;
    }
    public void setMatricula(Matricula matricula) {
        this.matricula = matricula;
    }

    public FormatoCertificado getFormatoCertificado() {
        return formatoCertificado;
    }
    public void setFormatoCertificado(FormatoCertificado formatoCertificado) {
        this.formatoCertificado = formatoCertificado;
    }

    public PersonaNatural getPersona() {
        return persona;
    }
    public void setPersona(PersonaNatural persona) {
        this.persona = persona;
    }

    public Integer getCodigoEvento() {
        return codigoEvento;
    }
    public void setCodigoEvento(Integer codigoEvento) {
        this.codigoEvento = codigoEvento;
    }

    public List<Matricula> getListaInscritos() {
        return listaInscritos;
    }
    public void setListaInscritos(List<Matricula> listaInscritos) {
        this.listaInscritos = listaInscritos;
    }

    public List<FormatoCertificado> getListaFormatoCertificado() {
        return listaFormatoCertificado;
    }
    public void setListaFormatoCertificado(List<FormatoCertificado> listaFormatoCertificado) {
        this.listaFormatoCertificado = listaFormatoCertificado;
    }

    public EntregaCertificado getEntregaCertificado() {
        return entregaCertificado;
    }
    public void setEntregaCertificado(EntregaCertificado entregaCertificado) {
        this.entregaCertificado = entregaCertificado;
    }

    public String getArchivo() {
        return archivo;
    }
    public void setArchivo(String archivo) {
        this.archivo = archivo;
    }

    /**********************************  Metodos  *****************************/
    public String guardarEntregas() {
        for (EntregaCertificado entrega : listaEntregaCertificado) {
            if (entrega != null) {
                entrega.setMatCodigo(entrega.getMatCodigo());
                formatoCertificado = delegadoFormatoCertificado.find(codigoFormato);
                entrega.setForCodigo(formatoCertificado);
                Boolean entregado = entrega.getSeleccion();
                entregado = (entregado != null) ? entregado : false;
                if (entregado) {
                    entrega.setEceEntregado(true);
                    entrega.setEceOrden(1);
                    Calendar calendario = Calendar.getInstance();
                    Date hoy = calendario.getTime();    //fecha y hora del sistema
                    entrega.setEceFecha(hoy);
                    delegado.edit(entrega);
                }
            }

              //else {
              //  entrega.setEceOrden(0);
              //  entrega.setEceFecha(null);
            //}
        }
        return listar();
    }

    public String guardarEntregasV2() {
        for (EntregaCertificado entrega : listaEntregaCertificadoV2) {
            if (entrega != null) {
                entrega.setPinCodigo(entrega.getPinCodigo());
                formatoCertificado = delegadoFormatoCertificado.find(codigoFormato);
                entrega.setForCodigo(formatoCertificado);
                Boolean entregado = entrega.getSeleccion();
                entregado = (entregado != null) ? entregado : false;
                if (entregado) {
                    entrega.setEceEntregado(true);
                    entrega.setEceOrden(1);
                    Calendar calendario = Calendar.getInstance();
                    Date hoy = calendario.getTime();    //fecha y hora del sistema
                    entrega.setEceFecha(hoy);
                    delegado.edit(entrega);
                }
            }

              //else {
              //  entrega.setEceOrden(0);
              //  entrega.setEceFecha(null);
            //}
        }
        return listarV2();
    }

    public String listar() {
        //validar parametros para las funciones
        try {
            codigoEvento = (codigoEvento!=null) ? codigoEvento : 0;
            codigoFormato = (codigoFormato != null) ? codigoFormato : 0;
            if (codigoEvento!=0 && codigoFormato!=0)
                listaEntregaCertificado = delegado.listarCertificados2(codigoEvento, codigoFormato);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar la entrega de certificados", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String listarV2() {
        //validar parametros para las funciones
        try {
            codigoEvento = (codigoEvento!=null) ? codigoEvento : 0;
            codigoFormato = (codigoFormato != null) ? codigoFormato : 0;
            if (codigoEvento!=0 && codigoFormato!=0)
                listaEntregaCertificadoV2 = delegado.listarCertificadosV2(codigoEvento, codigoFormato);
        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "En listar la entrega de certificados", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String mostrarEntregas() {
        try {
            persona = new PersonaNatural();
            System.out.println("codigoEvento: " + codigoEvento);
            System.out.println("codigoFormato: " + codigoFormato);
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            codigoFormato = (codigoFormato == null) ? 0 : codigoFormato;
            //buscar participantes, si existen verificar sus entregas
            listaInscritos = delegadoMatricula.listarMatriculadosXCurso(codigoEvento);  //revisar
            if (!listaInscritos.isEmpty()) {
                System.out.println("OK.....LISTA NO NULA");
                if (codigoFormato > 0) {
                    listaMatricula = delegado.listarMatriculadosAEntregar(codigoEvento, codigoFormato);
                    insertarEntregasFaltantes();
                }
                //listaEntregaCertificado = delegado.listarCertificados(codigoEvento, codigoFormato);
            }
            total = Utiles.totalRegistro(listaEntregaCertificado, "certificado(s) a entregar");

        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al mostrar los certificados", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String mostrarEntregasV2() {
        try {
            persona = new PersonaNatural();
            System.out.println("codigoEvento: " + codigoEvento);
            System.out.println("codigoFormato: " + codigoFormato);
            codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
            codigoFormato = (codigoFormato == null) ? 0 : codigoFormato;
            //buscar participantes, si existen verificar sus entregas
            listaInscritosV2 = delegado.listarPreInscritosV2(codigoEvento);  //revisar
            if (!listaInscritosV2.isEmpty()) {
                System.out.println("OK.....LISTA NO NULA");
                if (codigoFormato > 0) {
                    listaInscripcionesV2 = delegado.listarPreInscritosAEntregarV2(codigoEvento, codigoFormato);
                    insertarEntregasFaltantesV2();
                }
                //listaEntregaCertificado = delegado.listarCertificados(codigoEvento, codigoFormato);
            }
            total = Utiles.totalRegistro(listaEntregaCertificadoV2, "certificado(s) a entregar");

        } catch (Exception ex) {
            mostrarMensaje("ERROR: ", "Al mostrar los certificados", FacesMessage.SEVERITY_ERROR);
            System.out.println("FATAL: " + ex.getMessage());
        }
        return null;
    }

    public String validarCodigoEvento() {
        codigoEvento = (codigoEvento == null) ? 0 : codigoEvento;
        return null;
    }

    public String cancelar() {
        codigoEvento = 0;
        codigoFormato = 0;
        entregaCertificado = new EntregaCertificado();
        listaEntregaCertificado = new ArrayList<EntregaCertificado>();
        listaFormatoCertificado = new ArrayList<FormatoCertificado>();
        listaInscritos = new ArrayList<Matricula>();
        listaMatricula = new ArrayList<Matricula>();
        listaEntregaCertificadoV2 = new ArrayList<EntregaCertificado>();
        listaInscritosV2 = new ArrayList<PreinscripcionEvento>();
        return null;
    }

    public String insertarEntregasFaltantes() {
        FormatoCertificado formato = delegadoFormatoCertificado.find(codigoFormato);
        for (Matricula m : listaMatricula) {
            EntregaCertificado e = new EntregaCertificado();
            e.setForCodigo(formato);            //formato
            e.setMatCodigo(m);                  //matriculados
            e.setEceEntregado(false);           //entregas
            e.setEceVecesImpresion(0);          //veces que se imprimio
            System.out.println("Codigo: " + e.getEceCodigo());
            System.out.println("Matricula: " + e.getMatCodigo());
            System.out.println("Formato: " + e.getForCodigo());
            System.out.println("Entrega: " + e.getEceEntregado());
            System.out.println("Impresiones: " + e.getEceVecesImpresion());
            delegado.create(e);
            e = null;
        }
        formato = null;
        return listar();
    }

    public String insertarEntregasFaltantesV2() {
        FormatoCertificado formato = delegadoFormatoCertificado.find(codigoFormato);
        for (PreinscripcionEvento p : listaInscripcionesV2) {
            EntregaCertificado e = new EntregaCertificado();
            e.setForCodigo(formato);            //formato
            e.setPinCodigo(p);                  //inscritos
            e.setEceEntregado(false);           //entregas
            e.setEceVecesImpresion(0);          //veces que se imprimio
            System.out.println("Codigo: " + e.getEceCodigo());
            System.out.println("Inscripcion: " + e.getPinCodigo());
            System.out.println("Formato: " + e.getForCodigo());
            System.out.println("Entrega: " + e.getEceEntregado());
            System.out.println("Impresiones: " + e.getEceVecesImpresion());
            delegado.create(e);
            e = null;
        }
        formato = null;
        return listarV2();
    }

    public void mostrarMensaje(String resumen, String detalle, FacesMessage.Severity severidad) {
        try {
            FacesMessage fm = new FacesMessage(severidad, resumen, detalle);
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        } catch (Exception e) {
            FacesMessage fm = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), e.getMessage());
            FacesContext.getCurrentInstance().addMessage(fm.toString(), fm);
        }
    }

    public SelectItem[] getComboFormatoCertificados() {
        try {
            System.out.println("Ingreso 1");
            SelectItem[] selects = null;
            //codigoEvento = 3; //borrar esta linea
            System.out.println("codigoEvento: " + codigoEvento);
            List<FormatoCertificado> listaFormatos = delegadoFormatoCertificado.listarFormatosXEvento(codigoEvento);
            selects = new SelectItem[listaFormatos.size()];
            int cont = 0;
            for (FormatoCertificado formato : listaFormatos) {
                SelectItem item = new SelectItem(formato.getForCodigo(), formato.getForNombre());
                selects[cont++] = item;
            }
            return selects;
        } catch (Exception e) {
            System.out.println("Ingreso Error: " + e.getMessage());
            SelectItem[] selects = new SelectItem[1];
            SelectItem item = new SelectItem(null, "No existen formatos certificados");
            selects[0] = item;
            return selects;
        }
    }

    public String imprimir() {
        archivo = "/excel/impresiones.xls";
        try {
            HttpServletRequest request = ControladorAbstracto.getRequest();
            HttpServletResponse response = ControladorAbstracto.getResponse();
            String ruta = request.getRealPath(archivo);
            Impresiones imp = new Impresiones();
            imp.actualizarImpresion(response, ruta);
            File path = new File(ruta);
            Desktop.getDesktop().open(path);
        } catch (Exception e) {
            System.out.println(e.getMessage());
        }

        return null;
    }

    public boolean existFile(String name){
        FacesServlet s = new FacesServlet();
        File file = new File(s.getServletConfig().getServletContext().getRealPath(name));
        return file.exists();
    }

}
